/**
 * @Auther: ZZX
 * @Date: 2024/7/23-07-23-21:58
 * @Description: PACKAGE_NAME
 */
public class Demo10强制类型转换 {
    public static void main(String[] args) {
        // float num1 = 2.5; 编译器会默认将这个数字视为double类型。因为double类型的精度比float类型高，所以直接赋值可能会导致精度损失。
        // 正确做法：
        float num1 = (float)2.5; //或者2.5F
        // 精度损失：
        int i = (int)2.1;
        System.out.println(i);

        // 数据溢出：
        /*
        int型占内存4个字节，4个字节变成二进制是32位 1个字节8位
        10000000000->0010 0101 0100 0000 1011 1110 0100 0000 0000 34位二进制
        此时100个亿的二进制比int类型的二进制服务多出来2位，那么会干掉最前面的2位
        变成0101 0100 0000 1011 1110 0100 0000 0000 -> 1410065408
         */
        int j = 1000000000; //多一个0会报错
        System.out.println(j); //1000000000
        int j2= (int)10000000000L; //1410065408
        System.out.println(j2);

        byte b = 10;
        System.out.println(b); //10

        // b = b+1; byte,short如果等号右边有变量参与,那么byte和short会自动提升为int,然后将结果再次赋值给byte或者short的变量,此时需要我们自己手动强转
        b = (byte)(b+1);
        System.out.println(b);

        char c = 'a';
        System.out.println(c+0); //97
        int a = 0;
        System.out.println(a+'0'); //48

        //byte short 超取值范围
        /*
        200的二进制原码：1100 1000
        200的二进制反码：1011 0111
        200的二进制补码：1011 1000 ->-56
         */
        byte b2 = (byte)200;
        System.out.println(b2);//-56

        byte b3 = (byte)128;
        System.out.println(b3);//-128 byte的取值范围是-128~127 一旦超了127就从头数 从-128开始数
    }
}
